package com.txz.system.service.impl;

import java.util.List;
import java.util.Date;
import com.txz.common.utils.DateUtils;
import com.txz.common.core.domain.entity.SysUser;
import com.txz.common.core.domain.model.LoginUser;
import com.txz.framework.utils.auth.AuthCommonUtil; // 工具类新路径
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.txz.system.mapper.AppUserMapper;
import com.txz.system.domain.AppUser;
import com.txz.system.service.IAppUserService;

/**
 * 商城用户Service业务层处理（含登录/注册扩展）
 * 
 * @author tuxiaozhuo
 * @date 2025-10-21
 */
@Service
public class AppUserServiceImpl implements IAppUserService 
{
    @Autowired
    private AppUserMapper appUserMapper;

    // 注入通用认证工具类（密码加密、Token相关）
    @Autowired
    private AuthCommonUtil authCommonUtil;

    // ---------------------- 原有CRUD方法（保留） ----------------------
    @Override
    public AppUser selectAppUserById(Long id)
    {
        return appUserMapper.selectAppUserById(id);
    }

    @Override
    public List<AppUser> selectAppUserList(AppUser appUser)
    {
        return appUserMapper.selectAppUserList(appUser);
    }

    @Override
    public int insertAppUser(AppUser appUser)
    {
        appUser.setCreateTime(DateUtils.getNowDate());
        return appUserMapper.insertAppUser(appUser);
    }

    @Override
    public int updateAppUser(AppUser appUser)
    {
        appUser.setUpdateTime(DateUtils.getNowDate());
        return appUserMapper.updateAppUser(appUser);
    }

    @Override
    public int deleteAppUserByIds(Long[] ids)
    {
        return appUserMapper.deleteAppUserByIds(ids);
    }

    @Override
    public int deleteAppUserById(Long id)
    {
        return appUserMapper.deleteAppUserById(id);
    }

    // ---------------------- 新增接口实现 ----------------------
    /**
     * 通过用户名查询商城用户
     */
    @Override
    public AppUser selectAppUserByUsername(String username)
    {
        // 调用Mapper中按用户名查询的方法（需在Mapper中定义）
        return appUserMapper.selectAppUserByUsername(username);
    }

    /**
     * 通过微信openid查询商城用户
     */
    @Override
    public AppUser selectAppUserByOpenid(String openid)
    {
        // 调用Mapper中按openid查询的方法（需在Mapper中定义）
        return appUserMapper.selectAppUserByOpenid(openid);
    }

    /**
     * 账号密码注册（含密码加密）
     */
    @Override
    @Transactional // 确保注册操作原子性
    public boolean register(AppUser appUser)
    {
        // 1. 密码加密（使用通用认证工具类，与后台加密逻辑一致）
        String encryptedPassword = authCommonUtil.encryptPassword(appUser.getPassword());
        appUser.setPassword(encryptedPassword);

        // 2. 设置默认值（状态：正常；创建时间）
        appUser.setStatus(1L); // 1-正常，0-禁用
        appUser.setCreateTime(new Date());

        // 3. 插入数据库（调用原有CRUD的insert方法）
        int rows = this.insertAppUser(appUser);
        return rows > 0; // 插入成功返回true
    }

    /**
     * 创建微信用户（首次微信授权时）
     */
    @Override
    @Transactional
    public AppUser createWxUser(String openid, String unionid, String nickname, String wxAvatar)
    {
        AppUser appUser = new AppUser();
        // 微信相关字段
        appUser.setOpenid(openid);
        appUser.setUnionid(unionid);
        appUser.setNickname(nickname);
        appUser.setWxAvatar(wxAvatar);

        // 系统字段（自动生成，无需用户输入）
        appUser.setUsername("wx_" + openid.substring(0, 10)); // 用户名以wx_前缀+openid前10位
        appUser.setPassword(authCommonUtil.encryptPassword(String.valueOf(System.currentTimeMillis()))); // 随机密码（微信用户无需密码登录）
        appUser.setStatus(1L); // 默认正常状态
        appUser.setCreateTime(new Date());

        // 插入数据库
        this.insertAppUser(appUser);

        // 返回完整用户信息（含自增ID）
        return appUser;
    }

    /**
     * 构建LoginUser对象（用于生成Token）
     */
    @Override
    public LoginUser buildLoginUser(AppUser appUser){
        // 1. 创建SysUser对象，封装商城用户的用户名和密码
        SysUser sysUser = new SysUser();
        sysUser.setUserName(appUser.getUsername()); // 设置用户名（对应SysUser的userName字段）
        sysUser.setPassword(appUser.getPassword()); // 设置加密后的密码

        // 2. 创建LoginUser对象，关联SysUser和用户ID
        LoginUser loginUser = new LoginUser();
        loginUser.setUserId(appUser.getId()); // 设置商城用户ID（与AppUser的id关联）
        loginUser.setUser(sysUser); // 将SysUser对象传入LoginUser

        // 3. 可选：设置权限（若商城用户需要特定权限）
        // Set<String> permissions = new HashSet<>();
        // permissions.add("app:user:view"); // 示例权限
        // loginUser.setPermissions(permissions);

        return loginUser;
    }
}